package cn.edu.neu.lab603.des

import java.util.concurrent.atomic.AtomicInteger

/** 仿真实体。
  * 仿真实体是一个带有仿真ID跟踪的特性接口，没有其他特别的方法。但是仿真的参与对象都应该继承该特性接口，以方便目标跟踪。
  *
  * @author Zhi &lt; yfwz100@163.com &gt;
  */
trait SimEntity {
  val id: Long = SimEntity.idGen.incrementAndGet()
  SimEntity.pool(id) = this
}

/** 仿真实体附属对象，用于目标跟踪。
  *
  * @author Zhi &lt; yfwz100@163.com &gt;
  */
object SimEntity {

  /** ID 生成器 */
  private val idGen = new AtomicInteger()

  /** 仿真实体池 */
  private val pool = new scala.collection.mutable.HashMap[Long, SimEntity]

  /** 获得实体的引用。
    *
    * @param id 实体的编号
    * @return 仿真实体
    */
  def get[E](id: Long): E = pool(id).asInstanceOf[E]
}

/** 仿真实体的引用。
  *
  * @param id 仿真实体的ID
  */
class SimEntityRef(val id: Int) {

  /** 获取对应的仿真实体。
    * 注意类型应该匹配，否则会发生类型转换错误。
    *
    * @tparam E 仿真实体的类型
    * @return 仿真实体
    */
  def get[E <: SimEntity]: E = SimEntity.get(id).asInstanceOf[E]
}